package com.arcsoft.crud.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
 
public class ConnectionDB {
 
    /**
     * 驱动包
     */
    private static final String DRIVER = Configer.getValueString("driverClassName");
     
    /**
     * 数据库地址
     */
    private final String URL = Configer.getValueString("url");
     
    /**
     * 用户名
     */
    private final String USER = Configer.getValueString("username");
     
    /**
     * 密码
     */
    private final String PASSWORD = Configer.getValueString("password");
     
    /**
     * 数据库连接
     */
    Connection conn;
     
    /**
     * SQL命令
     */
    PreparedStatement pst;
     
    /**
     * 结果集
     */
    ResultSet rs;
     
     
    /**
     * 加载数据库驱动
     */
    static{
        try {
            //加载驱动
            Class.forName(DRIVER);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("加载驱动失败");
        }
    }
     
     
    /**
     * 取得和数据库的连接
     * @return Connection
     */
    private Connection getConnection() {
        try {
            conn = DBManager.getConn();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("连接数据库失败");
        }
        return conn;
    }
     
     
    /**
     * 查询数据库
     * @param sql SQL语句
     * @param arrays 参数数组
     * @return 参数列表
     */
    public List getDataBySql(String sql,Object arrays[]) {
         
        List list = new ArrayList();
         
        try {
            //取得连接
            conn = this.getConnection();
             
            if(conn == null) {
                return list;
            }
             
            //用sql语句对数据库进行操作
            pst  =conn.prepareStatement(sql);
             
            //设置参数
            if(arrays != null){
	            for (int i = 0; i < arrays.length; i++) {
	                pst.setObject(i+1, arrays[i]);
	            }
            }
             
            //将查询结果放入结果集rs中
            rs = pst.executeQuery();
             
            //遍历rs，并将rs的内容放入List中
            while(rs.next()) {
                 
                // 获取包含有关 ResultSet 对象列信息的 ResultSetMetaData 对象
                ResultSetMetaData rm = pst.getMetaData();
                 
                Map map = new HashMap();
                 
                for (int i = 1; i <=rm.getColumnCount(); i++) {
                    //往map里放入列名和对应的值
                    map.put(rm.getColumnName(i), rs.getObject(i));
                }
                //将map放入list中
                list.add(map);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return list;
    }
     
     
    /**
     * 插入、删除、更新操作
     * @param sql SQL语句
     * @param arrays 参数数组
     * @return 影响的行数
     */
    public int updateBySql(String sql,Object arrays[]) {
         
        List list = new ArrayList();
         
        //初始化影响的行数
        int line = 0;
        try {
            conn = this.getConnection();
             
            if(conn == null) {
                return 0;
            }
            
            pst  =conn.prepareStatement(sql);
             
            //设置参数
            for (int i = 0; i < arrays.length; i++) {
                pst.setObject(i+1, arrays[i]);
            }
             
            //操作数据库，返回行数

            line = pst.executeUpdate();
             
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return line;
    }
     
     public static void main(String args[]){
    	 String sql = "insert into people(name, age,password,name1,password1,name2,score,score1,score2,score4) values(?,?,?,?,?,?,?,?,?,?)";
         Object arrays[] = {randomString((int)Math.random()*10), (int)Math.random()*100,
 			        		randomString((int)Math.random()*10),randomString((int)Math.random()*10),
 			        		randomString((int)Math.random()*10),randomString((int)Math.random()*10),
 			        		Math.random()*100,Math.random()*100,randomString((int)Math.random()*10),randomString((int)Math.random()*10)
 			        	  };
         new ConnectionDB().updateBySql(sql,arrays);
     }
     
     /**
	   * 产生随机字符串
	   * */
	private static Random randGen = null;
	private static char[] numbersAndLetters = null;
     
     public static final String randomString(int length) {
         if (length < 1) {
             length = 4;
         }
         if (randGen == null) {
                randGen = new Random();
                numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz" +
                   "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
                 }
         char [] randBuffer = new char[length];
         for (int i=0; i<randBuffer.length; i++) {
             randBuffer[i] = numbersAndLetters[randGen.nextInt(71)];
         }
         return new String(randBuffer);
}
     
    /**
     * 关闭数据库连接
     */
    public void close() {
        try {
            if(rs != null){
                rs.close();
            }
             
            if(pst != null){
                pst.close();
            }
             
            if(conn != null){
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("关闭连接出错");
            System.exit(0);
        }
    }
     
}
 
 
 
 

